package cn.fuxi2022.accounts.commonMessage.service.impl;

import cn.fuxi2022.accounts.commonMessage.service.WeChatCommonMessageService;
import cn.fuxi2022.accounts.reply.service.AccountsReplyService;
import cn.fuxi2022.core.utils.SHA1;
import cn.fuxi2022.rabbitmq.appletsPay.constants.RegisterConstants;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Map;

@Service
public class
WeChatCommonMessageServiceImpl implements WeChatCommonMessageService {

    @Autowired
    private AccountsReplyService accountsReplyService;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public boolean verifyToken(String signature, String timestamp, String nonce) {
        String[] str = new String[]{token, timestamp, nonce};
        //排序
        Arrays.sort(str);
        //拼接字符串
        StringBuffer buffer = new StringBuffer();
        for (String s : str) {
            buffer.append(s);
        }
        //进行sha1加密
        String temp = SHA1.encode(buffer.toString());
        //与微信提供的signature进行匹对
        return signature.equals(temp);
    }

    @Override
    public String receiveMessage(Map<String, String> map) {

        // 判断当前是 接收普通消息（用户发送信息） 还是 接收事件推送（用户触发事件）
        String msgType = map.get("MsgType");

        switch (msgType) {
            case "text":
                // 2.接收普通消息（用户发送信息）的分支
                return commonMessage(map);
            case "event":
                // 3.接收事件推送（用户触发事件）的分支
                return eventPush(map);
            default:
                return "success";
        }
    }

    /**
     * 接收普通消息（用户发送信息）的分支
     *
     * @return 返回的消息内容
     */
    public String commonMessage(Map<String, String> map) {
        // 执行 处理关键字搜索 业务
        return search(map);
    }


    /**
     * 接收事件推送（用户触发事件）的分支
     *
     * @return 返回的消息内容
     */
    public String eventPush(Map<String, String> map) {
        // 响应的消息
        String content;

        // 3.1 判断当前是什么事件
        switch (map.get("Event")) {
            case "subscribe":
                // 3.2当前是关注公众号事件
                // 执行关注公众号的业务
                content = accountsReplyService.getReplyContent("subscribe");
                break;
            case "CLICK":
                // 3.3当前是点击菜单事件
                // 获取当前用户点击的菜单KEY
                String eventKey = map.get("EventKey");
                // 执行点击菜单的业务
                content = accountsReplyService.getReplyContent(eventKey);
                break;
            case "SCAN":
                // 3.4 当前是活动签到事件
                // 调用MQ，将扫码用户传入，交给消费者处理签到相关业务
                rabbitTemplate.convertAndSend(RegisterConstants.GROUP_REGISTER_TTL_EXCHANGE, null, JSON.toJSONString(map));
                content = accountsReplyService.getReplyContent("register");
                break;
            default:
                content = "success";
        }

        return text(map, content);
    }

    /**
     * 处理关键字搜索课程事件
     * 回复的是关于课程的图文消息（未实现，测试）
     * 图文消息个数；当用户发送文本、图片、语音、视频、图文、地理位置这六种消息时，开发者只能回复1条图文消息；其余场景最多可回复8条图文消息
     * “硅谷课堂”公众号实现根据关键字搜索相关课程，如：输入“java”，可返回java相关的一个课程
     *
     * @param param 解析微信推送的 XML 数据包后的map
     * @return 微信所需的 图文消息XML 或 普通消息XML
     */
    private String search(Map<String, String> param) {
        // 1.获取 发送方帐号（一个OpenID） + 开发者微信号 + 文本消息内容（重要，用户发送的消息）
        String fromusername = param.get("FromUserName");
        String tousername = param.get("ToUserName");
        String content = param.get("Content");

        // 2.构建 消息创建时间 （整型）
        //单位为秒，不是毫秒
        Long createTime = System.currentTimeMillis() / 1000;

        // 3.响应给微信的消息
        StringBuffer text = new StringBuffer();

        // 3.查询课程，找出最符合的课程（测试，不实现）
        content = accountsReplyService.getReplyContent(content);

        // 4.判断是否有符合的查询结果，没有就切换至回复文字方法，当前方法终止
        if (StringUtils.isEmpty(content)) {
            // 切换至回复文字方法
            content = accountsReplyService.getReplyContent("error");
        }

        return text(param, content);
    }

    /**
     * 回复文本消息
     *
     * @param param   解析微信推送的 XML 数据包后的map
     * @param content 发送的消息内容
     * @return 普通消息XML
     */
    private String text(Map<String, String> param, String content){
        String fromusername = param.get("FromUserName");
        String tousername = param.get("ToUserName");
        //单位为秒，不是毫秒
        Long createTime = System.currentTimeMillis() / 1000;
        StringBuffer text = new StringBuffer();
        text.append("<xml>");
        text.append("<ToUserName><![CDATA[").append(fromusername).append("]]></ToUserName>");
        text.append("<FromUserName><![CDATA[").append(tousername).append("]]></FromUserName>");
        text.append("<CreateTime><![CDATA[").append(createTime).append("]]></CreateTime>");
        text.append("<MsgType><![CDATA[text]]></MsgType>");
        text.append("<Content><![CDATA[").append(content).append("]]></Content>");
        text.append("</xml>");
        return text.toString();
    }

    /**
     * 回复图文消息
     *
     * @param param       解析微信推送的 XML 数据包后的map
     * @param title       发送的图文消息标题
     * @param description 发送的图文消息描述
     * @param picUrl      发送的图文消息描图片链接
     * @param url         发送的图文消息跳转链接
     * @return 普通消息XML
     */
    private String textPic(Map<String, String> param, String title, String description, String picUrl, String url) {
        String fromusername = param.get("FromUserName");
        String tousername = param.get("ToUserName");
        //单位为秒，不是毫秒
        Long createTime = System.currentTimeMillis() / 1000;
        StringBuffer text = new StringBuffer();

        //一次只能返回一个（因为当前是属于用户发送文本）
        StringBuffer articles = new StringBuffer();

        // 构建内层图文
        articles.append("<item>");
        articles.append("<Title><![CDATA[" + title + "]]></Title>");
        articles.append("<Description><![CDATA[" + description + "]]></Description>");
        articles.append("<PicUrl><![CDATA[" + picUrl + "]]></PicUrl>");
        articles.append("<Url><![CDATA[" + url + "]]></Url>");
        articles.append("</item>");

        // 构建外层
        text.append("<xml>");
        text.append("<ToUserName><![CDATA[" + fromusername + "]]></ToUserName>");
        text.append("<FromUserName><![CDATA[" + tousername + "]]></FromUserName>");
        text.append("<CreateTime><![CDATA[" + createTime + "]]></CreateTime>");
        text.append("<MsgType><![CDATA[news]]></MsgType>");
        text.append("<ArticleCount><![CDATA[1]]></ArticleCount>");
        text.append("<Articles>");
        text.append(articles);
        text.append("</Articles>");
        text.append("</xml>");

        return text.toString();
    }
}
